# 作者: 赵若云
# 2025年02月28日00时51分25秒
# 3478783573@qq.com

import re

# * 匹配前一个字符出现0个或多次，可有可无
# + 匹配前一个字符出现1个或多次，必须至少有一个
# ? 匹配前一个字符出现0个或1次，要么有1次，要么没有
# {n} 匹配前一个字符出现n次
# {n,m} 匹配前一个字符出现从n到m次

ret = re.match("[A-Z][a-z]*", "M")  # [a-z]*是个整体
print(ret.group())
ret = re.match("[A-Z][a-z]*", "MnnM")  # 最后一个M不匹配
print(ret.group())
ret = re.match("[A-Z][a-z]*", "Aabcdef")  # 后面全是小写字母，全部匹配上
print(ret.group())
print('-' * 50)

# 变量名匹配
# 变量名只能以字母或下划线开头，后面可以是字母、数字或下划线
names = ["name1", "_name", "2_name", "__name__"]
for name in names:
    # 加r是为了防止反斜杠 \ 被 Python 误解析
    ret = re.match(r"[a-zA-Z_]\w*", name)  # \w匹配字母、数字、下划线、汉字
    if ret:
        print(f'{ret.group()}是合法的变量名')
    else:
        print(f'{name}不是合法的变量名')  # 因为没匹配上，所以不能用ret.group()，group()方法返回匹配到的字符串
print('-' * 50)

# 匹配0-99是否合法
# ? 匹配前一个字符出现0个或1次，要么有1次，要么没有
ret = re.match(r"[1-9]?[0-9]", "7")
print(ret.group())
ret = re.match(r"[1-9]?\d", "33")  # \d匹配数字
print(ret.group())
# ret = re.match(r"[1-9]?\d", "09")  # 只匹配了0
ret = re.match(r"[1-9]?\d$", "09")  # 0只能去\d中匹配
if ret:
    print(ret.group())
else:
    print("数字不合法")
print('-' * 50)

ret = re.match("[a-zA-Z0-9_]{6}", "12a3g45678")  # {6} 匹配6个字符
print(ret.group())
ret = re.match("[a-zA-Z0-9_]{8,20}", "1ad12f23s34455ff66")  # {8,20} 匹配8-20个字符,默认是贪婪模式，尽可能多匹配，即能匹配就一直匹配
print(ret.group())
print('-' * 50)

# 匹配邮箱地址
email_list = ["xiaoWang@163.com", "xiaoWang@1636com", "xiaoWang@163.comheihei", ".com.xiaowang @ qq.com"]
for email in email_list:
    # 要加$，限定结尾，否则xiaoWang@163.comheihei也会匹配上
    ret = re.match(r'\w{5,20}@163\.com$', email)  # 记得.要转义,不加的话xiaoWang@1636com会被匹配上
    if ret:
        print(f'{email}是合法的邮箱')
    else:
        print(f'{email}不是合法的邮箱')
